package cqrtplm.util;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.ty.basic.session.TyAccountContext;
import cqrtplm.constant.IpAddressConstant;
import org.springframework.stereotype.Component;

import java.util.Calendar;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @description: 顺延天数工具类
 * @author: zhengxiong.jiang
 * @createDate: 2025-10-28
 * @version: 1.0
 */
@Component
public class WorkingDayUtil {

    // 定义节假日（可以从数据库或API获取）
//    private static final Set<String> HOLIDAYS = new HashSet<>();
//    static {
//        HOLIDAYS.add("2026-01-01"); //新年
//        HOLIDAYS.add("2026-02-17"); //春节
//        HOLIDAYS.add("2026-02-18"); //春节
//        HOLIDAYS.add("2026-02-19"); //春节
//        HOLIDAYS.add("2026-02-20"); //春节
//        HOLIDAYS.add("2026-02-21"); //春节
//        HOLIDAYS.add("2026-02-22"); //春节
//        HOLIDAYS.add("2026-02-23"); //春节
//        HOLIDAYS.add("2026-04-04"); //清明
//        HOLIDAYS.add("2026-05-01"); //劳动
//        HOLIDAYS.add("2026-06-19"); //端午
//        HOLIDAYS.add("2026-09-27"); //中秋
//        HOLIDAYS.add("2026-10-01"); //国庆
//        HOLIDAYS.add("2026-10-02"); //国庆
//        HOLIDAYS.add("2026-10-03"); //国庆
//        HOLIDAYS.add("2026-10-04"); //国庆
//        HOLIDAYS.add("2026-10-05"); //国庆
//        HOLIDAYS.add("2026-10-06"); //国庆
//        HOLIDAYS.add("2026-10-07"); //国庆
//
//    }
//
//    // 添加工作日的方法
//    public static DateTime addWorkingDays(DateTime startDate, int daysToAdd) {
//        DateTime result = startDate;
//        int addedDays = 0;
//
//        while (addedDays < daysToAdd) {
//            result = DateUtil.offsetDay(result, 1); // 加一天
//            if (isWorkingDay(result)) {
//                addedDays++;
//            }
//        }
//        return result;
//    }
//
//    // 判断是否是工作日
//    private static boolean isWorkingDay(DateTime date) {
//        Calendar cal = Calendar.getInstance();
//        cal.setTime(date);
//
//        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
//        boolean isWeekend = (dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY); // 周末
//        boolean isHoliday = HOLIDAYS.contains(DateUtil.formatDate(date)); // 节假日
//
//        return !isWeekend && !isHoliday; // 不是周末且不是节假日
//    }

    /**
     * 获取项目管理工作日排程时间
     * @return
     */
    public JSONObject getCalendarExceptionAndWeekDayByProjectOid() {
        String body = HttpRequest.get(
                IpAddressConstant.TY_CS_PROJECT)
                .header("Content-Type", "application/json")
                // 设置认证令牌
                .header(org.springframework.http.HttpHeaders.AUTHORIZATION, TyAccountContext.getToken())
                .execute().body();
        // 转为 JSONObject
        JSONObject jsonObject = JSONUtil.parseObj(body);
        //获取工作周
        List<Integer> dayTypeList = getWeekDays(jsonObject);
        //获取例外工作日时间
        List<JSONObject> timePeriodList = getExceptions(jsonObject);

        return jsonObject;
    }

    /**
     * 获取非工作周
     * @param jsonObject
     * @return
     */
    public List<Integer> getWeekDays(JSONObject jsonObject) {
        JSONObject data = jsonObject.getJSONObject("data");
        JSONArray weekDays = data.getJSONArray("WeekDays");
        List<Integer> dayTypeList = weekDays.stream()
                .map(obj -> (JSONObject) obj)
                .filter(item -> item != null)
                .filter(item -> {
                    Integer dayWorking = item.getInt("dayWorking");
                    return dayWorking != null && dayWorking == 0;
                })
                .map(item -> item.getInt("dayType"))
                .filter(dayType -> dayType != null)
                .collect(Collectors.toList());
        return dayTypeList;
    }

    /**
     * 获取非例外工作时间
     * @param jsonObject
     * @return
     */
    public List<JSONObject> getExceptions(JSONObject jsonObject) {
        JSONObject data = jsonObject.getJSONObject("data");
        JSONArray exceptionsArray = data.getJSONArray("Exceptions");
        List<JSONObject> timePeriodList = exceptionsArray.stream()
                .map(obj -> (JSONObject) obj)
                .filter(exception -> exception != null)
                .filter(exception -> {
                    Integer dayWorking = exception.getInt("DayWorking");
                    return dayWorking != null && dayWorking == 0;
                })
                .map(exception -> exception.getJSONObject("TimePeriod"))
                .filter(timePeriod -> timePeriod != null)
                .collect(Collectors.toList());
        return timePeriodList;
    }


//    public static void main(String[] args) {
//        DateTime start = DateUtil.parse("2025-10-28"); // 起始日期
//        DateTime result = addWorkingDays(start, 5); // 加5个工作日
//        System.out.println("完成时间：" + result);
//    }

}
